package cn.demoncat.util.mybatis.base;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

import cn.demoncat.util.lang.entity.report.SidCountVo;
import cn.demoncat.util.lang.entity.Result;
import cn.demoncat.util.lang.entity.report.SidCountSum;
import cn.demoncat.util.lang.entity.report.ReportDataPeriodCount;
import cn.demoncat.util.lang.entity.report.ReportDataPeriodCountSum;
import cn.demoncat.util.lang.entity.report.ReportDataPeriodCounts;
import cn.demoncat.util.lang.entity.report.ReportDataPeriodSum;
import cn.demoncat.util.lang.entity.report.ReportDataPeriodSums;
import cn.demoncat.util.lang.entity.report.ReportDataTimeCount;
import cn.demoncat.util.lang.entity.report.ReportDataTimeCountSum;
import cn.demoncat.util.lang.entity.report.ReportDataTimeCounts;
import cn.demoncat.util.lang.entity.report.ReportDataTimeSum;
import cn.demoncat.util.lang.entity.report.ReportDataTimeSums;
import cn.demoncat.util.lang.entity.report.ReportParam;
import cn.demoncat.util.lang.entity.report.ReportParamSave;
import cn.demoncat.util.lang.entity.report.ReportTime;

/**
 * 报表数据Service
 * 
 * @author 延晓磊
 *
 * @since 2019年12月10日
 */
public interface BaseReportService<T extends BaseReportEntity<T,P>, P extends Serializable> extends BaseService<T, P>{

	/**
	 * 插入报表：自动填充统计日期数据
	 * 
	 * @param o
	 * @param param	图表插入的查询+填充参数：ReportParamSave.build(mode)
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月11日
	 */
	void saveReport(T o, ReportParamSave param);

	/**
	 * 插入报表：自动填充统计日期数据
	 * 
	 * @param os
	 * @param param	图表插入的查询+填充参数：ReportParamSave.build(mode)
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月11日
	 */
	void saveReport(List<T> os, ReportParamSave param);
	
	/**
	 * 统计 - 总数
	 * 
	 * @param condition
	 * @return SUM(count)
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年10月19日
	 */
	long countCount(Map<String,Object> condition);
	
	/**
	 * 统计 - 维度:总数
	 * 
	 * @param condition
	 * 
	 * @return {id:item, count:SUM(count)}
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年10月19日
	 */
	List<SidCountVo> countCountByItem(Map<String, Object> condition);
	
	/**
	 * 统计 - 维度:总数
	 * 
	 * @param condition
	 * @param itemMap	维度映射（只返回映射的数据）
	 * 
	 * @return {id:item, name: itemMap[item], count:SUM(count)}
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年10月19日
	 */
	List<SidCountVo> countCountByItem(Map<String, Object> condition, Map<String,String> itemMap);
	
	/**
	 * 统计 - 维度:总数
	 * 
	 * @param condition
	 * 
	 * @return {id:item, name:title, count:SUM(count)}
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年10月19日
	 */
	List<SidCountVo> countCountByItemTitle(Map<String, Object> condition);

	/**
	 * 统计 - 总额
	 * 
	 * @param condition
	 * @return SUM(sum)
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年10月19日
	 */
	BigDecimal countSum(Map<String,Object> condition);
	
	/**
	 * 统计 - 维度:总额
	 * 
	 * @param condition
	 * 
	 * @return {id:item, sum:SUM(sum)}
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年10月19日
	 */
	List<SidCountVo> countSumByItem(Map<String, Object> condition);
	
	/**
	 * 统计 - 维度:总额
	 * 
	 * @param condition
	 * @param itemMap	维度映射（只返回映射的数据）
	 * 
	 * @return {id:item, name: itemMap[item], sum:SUM(sum)}
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年10月19日
	 */
	List<SidCountVo> countSumByItem(Map<String, Object> condition, Map<String,String> itemMap);

	/**
	 * 统计 - 维度:总额
	 * 
	 * @param condition
	 * 
	 * @return {id:item, name:title, sum:SUM(sum)}
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年10月19日
	 */
	List<SidCountVo> countSumByItemTitle(Map<String, Object> condition);
	
	/**
	 * 统计 - 总数,总额
	 * 
	 * @param condition
	 * 
	 * @return {count:SUM(count), sum:SUM(sum)}
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年10月19日
	 */
	SidCountSum counts(Map<String, Object> condition);
	
	/**
	 * 统计 - 维度:总数,总额
	 * 
	 * @param condition
	 * 
	 * @return {id:item, count:SUM(count), sum:SUM(sum)}
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年10月19日
	 */
	List<SidCountVo> countsByItem(Map<String, Object> condition);

	/**
	 * 统计 - 维度:总数,总额
	 * 
	 * @param condition
	 * @param itemMap		维度映射（只返回映射的数据）
	 * 
	 * @return {id:item, name: itemMap[item], count:SUM(count), sum:SUM(sum)}
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年10月19日
	 */
	List<SidCountVo> countsByItem(Map<String, Object> condition, Map<String,String> itemMap);
	
	/**
	 * 统计 - 维度:总数,总额
	 * 
	 * @param condition
	 * 
	 * @return {id:item, name:title, count:SUM(count), sum:SUM(sum)}
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年10月19日
	 */
	List<SidCountVo> countsByItemTitle(Map<String, Object> condition);
	
	/**
	 * 图表 - 总数
	 * 
	 * @param condition
	 * @return SUM(count)
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年10月19日
	 */
	List<T> chartCount(Map<String,Object> condition);
	
	/**
	 * 图表 - 总额
	 * 
	 * @param condition
	 * @return SUM(sum)
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年10月19日
	 */
	List<T> chartSum(Map<String,Object> condition);
	
	/**
	 * 图表 - 总数,总额
	 * 
	 * @param condition
	 * @return SUM(count),SUM(sum)
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年10月19日
	 */
	List<T> charts(Map<String,Object> condition);

	/**
	 * 分时图表：单维度 count
	 * 
	 * @param mode		模式：ReportConstant.ModeTimeTime
	 * @param date		基准日期：用于查询历史日期的图表，默认当天（时表）、当月（日表）、当年（月表）
	 * @param condition	查询参数：type,item,...
	 * 
	 * @return {category,value}
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月11日
	 */
	ReportDataTimeCount timeChartCount(String mode, ReportTime date, Map<String, Object> condition);

	/**
	 * 分时图表：单维度 sum
	 * 
	 * @param mode		模式：ReportConstant.ModeTime
	 * @param date		基准日期：用于查询历史日期的图表，默认当天（时表）、当月（日表）、当年（月表）
	 * @param condition	查询参数：type,item,...
	 * 
	 * @return {category,value}
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月11日
	 */
	ReportDataTimeSum timeChartSum(String mode, ReportTime date, Map<String, Object> condition);

	/**
	 * 分时图表：双维度 count,sum
	 * 
	 * @param mode			模式：ReportConstant.ModeTime
	 * @param date			基准日期：用于查询历史日期的图表，默认当天（时表）、当月（日表）、当年（月表）
	 * @param condition		查询参数：type,item,...
	 * @param countTitle	count的维度标题
	 * @param sumTitle		sum的维度标题
	 * 
	 * @return {category,value,legend[countTitle,sumTitle]}
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月11日
	 */
	ReportDataTimeCountSum timeCharts(String mode, ReportTime date, Map<String, Object> condition, String countTitle, String sumTitle);

	/**
	 * 分时图表：多维度 count
	 * 
	 * @param mode		模式：ReportConstant.ModeTime
	 * @param date		基准日期：用于查询历史日期的图表，默认当天（时表）、当月（日表）、当年（月表）
	 * @param condition	查询参数：type,item,...
	 * @param items		维度映射：{item:title}，如果为空则获取{data.item:data.title}
	 * 
	 * @return {category,value,legend[title]}
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月11日
	 */
	ReportDataTimeCounts timeChartCounts(String mode, ReportTime date, Map<String, Object> condition, Map<String, String> items);

	/**
	 * 分时图表：多维度 sum
	 * 
	 * @param mode		模式：ReportConstant.ModeTime
	 * @param date		基准日期：用于查询历史日期的图表，默认当天（时表）、当月（日表）、当年（月表）
	 * @param condition	查询参数：type,item,...
	 * @param items		维度映射：{item:title}，如果为空则获取{data.item:data.title}
	 * 
	 * @return {category,value,legend[title]}
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月11日
	 */
	ReportDataTimeSums timeChartSums(String mode, ReportTime date, Map<String, Object> condition, Map<String, String> items);

	/**
	 * 分时图表：多维度 count
	 * 
	 * @param mode		模式：ReportConstant.ModeTime
	 * @param date		基准日期：用于查询历史日期的图表，默认当天（时表）、当月（日表）、当年（月表）
	 * @param condition	查询参数：type,item,...
	 * @param items		维度列表：[item]，如果为空则获取[data.item]
	 * 
	 * @return {category,value,legend[item]}
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月11日
	 */
	ReportDataTimeCounts timeChartCounts2(String mode, ReportTime date, Map<String, Object> condition, List<String> items);

	/**
	 * 分时图表：多维度 sum
	 * 
	 * @param mode		模式：ReportConstant.ModeTime
	 * @param date		基准日期：用于查询历史日期的图表，默认当天（时表）、当月（日表）、当年（月表）
	 * @param condition	查询参数：type,item,...
	 * @param items		维度列表：[item]，如果为空则获取[data.item]
	 * 
	 * @return {category,value,legend[item]}
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月11日
	 */
	ReportDataTimeSums timeChartSums2(String mode, ReportTime date, Map<String, Object> condition, List<String> items);
	
	/**
	 * 周期图表：单维度 count
	 * 
	 * @param mode		模式：ReportConstant.ModePeriod
	 * @param num		周期数
	 * @param date		基准日期(结束周期)，默认当前
	 * @param condition	查询参数：type,item,...
	 * 
	 * @return {category,value}
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月11日
	 */
	ReportDataPeriodCount periodChartCount(String mode, Integer num, LocalDateTime date, Map<String, Object> condition);

	/**
	 * 周期图表：单维度 sum
	 * 
	 * @param mode		模式：ReportConstant.ModePeriod
	 * @param num		周期数
	 * @param date		基准日期(结束周期)，默认当前
	 * @param condition	查询参数：type,item,...
	 * 
	 * @return {category,value}
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月11日
	 */
	ReportDataPeriodSum periodChartSum(String mode, Integer num, LocalDateTime date, Map<String, Object> condition);

	/**
	 * 周期图表：双维度 count,sum
	 * 
	 * @param mode			模式：ReportConstant.ModePeriod
	 * @param num			周期数
	 * @param date			基准日期(结束周期)，默认当前
	 * @param condition		查询参数：type,item,...
	 * @param countTitle	count的维度标题
	 * @param sumTitle		sum的维度标题
	 * 
	 * @return {category,value,legend[countTitle,sumTitle]}
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月11日
	 */
	ReportDataPeriodCountSum periodCharts(String mode, Integer num, LocalDateTime date, Map<String, Object> condition, String countTitle, String sumTitle);

	/**
	 * 周期图表：多维度 count
	 * 
	 * @param mode		模式：ReportConstant.ModePeriod
	 * @param num		周期数
	 * @param date		基准日期(结束周期)，默认当前
	 * @param condition	查询参数：type,item,...
	 * @param items		维度映射：{item:title}，如果为空则获取{data.item:data.title}
	 * 
	 * @return {category,value,legend[title]}
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月11日
	 */
	ReportDataPeriodCounts periodChartCounts(String mode, Integer num, LocalDateTime date, Map<String, Object> condition, Map<String, String> items);

	/**
	 * 周期图表：多维度 sum
	 * 
	 * @param mode		模式：ReportConstant.ModePeriod
	 * @param num		周期数
	 * @param date		基准日期(结束周期)，默认当前
	 * @param condition	查询参数：type,item,...
	 * @param items		维度映射：{item:title}，如果为空则获取{data.item:data.title}
	 * 
	 * @return {category,value,legend[title]}
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月11日
	 */
	ReportDataPeriodSums periodChartSums(String mode, Integer num, LocalDateTime date, Map<String, Object> condition, Map<String, String> items);

	/**
	 * 周期图表：多维度 count
	 * 
	 * @param mode		模式：ReportConstant.ModePeriod
	 * @param num		周期数
	 * @param date		基准日期(结束周期)，默认当前
	 * @param condition	查询参数：type,item,...
	 * @param items		维度列表：[item]，如果为空则获取[data.item]
	 * 
	 * @return {category,value,legend[item]}
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月11日
	 */
	ReportDataPeriodCounts periodChartCounts2(String mode, Integer num, LocalDateTime date, Map<String, Object> condition, List<String> items);

	/**
	 * 周期图表：多维度 sum
	 * 
	 * @param mode		模式：ReportConstant.ModePeriod
	 * @param num		周期数
	 * @param date		基准日期(结束周期)，默认当前
	 * @param condition	查询参数：type,item,...
	 * @param items		维度列表：[item]，如果为空则获取[data.item]
	 * 
	 * @return {category,value,legend[item]}
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月11日
	 */
	ReportDataPeriodSums periodChartSums2(String mode, Integer num, LocalDateTime date, Map<String, Object> condition, List<String> items);

	/**
	 * 整合Count
	 * 
	 * @param mode		模式：ReportConstant.CountMode
	 * @param condition	查询条件
	 * @param itemMap	维度映射（只返回映射的数据）
	 * 
	 * @return 统计数据/维度列表
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月12日
	 */
	Result counts(String mode, Map<String, Object> condition, Map<String, String> itemMap);

	/**
	 * 整合Charts
	 * 
	 * @param fullMode		完整模式，由3位整数组成：2位模式ReportConstant.ModeTime/ModePeriod + 1位维度Dimension
	 * @param condition		查询条件
	 * @param date			分时图表的基准日期：用于查询历史日期的图表，默认当天（时表）、当月（日表）、当年（月表）
	 * @param num			周期图表的周期数
	 * @param endDate		周期图表的截止日期：用于判断结束周期，默认当前
	 * @param countTitle	双维度：count的维度标题
	 * @param sumTitle		双维度：sum的维度标题
	 * @param itemMap		多维度映射：{item, title}，如果为空则获取{data.item:data.title}
	 * @param itemList		多维度列表：[item]，如果为空则获取[data.item]
	 * @param itemType		多维度类型：非空优先，都为空则true itemMap, false itemList
	 * 
	 * @return 单维度{category,value}，双维度{category,value,legend[countTitle,sumTitle]}，多维度{category,value,legend[item]}、{category,value,legend[title]}
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月12日
	 */
	Result charts(String fullMode, Map<String, Object> condition, 
			ReportTime date, 
			Integer num, LocalDateTime endDate, 
			String countTitle, String sumTitle, 
			Map<String, String> itemMap, List<String> itemList, boolean itemType);

	/**
	 * 统计图表：整合报表的counts/charts
	 * 
	 * @param param		报表统计参数
	 * @param condition	数据查询参数：type,item,...
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月12日
	 */
	Result countCharts(ReportParam param, Map<String, Object> condition);
	
	/**
	 * 统计图表：整合报表的counts/charts
	 * 
	 * @param param		报表统计参数
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月12日
	 */
	Result countCharts(ReportParam param);
 
}
